package array.binarySearch;
/**
 * 题目:给定一个 n 个元素有序的（升序）整型数组 nums 和一个目标值 target  ，
      写一个函数搜索 nums 中的 target，如果 target 存在返回下标，否则返回 -1。

 *  时间复杂度: log(n)，空间复杂度:O(1)

 *  循环不变量(区间范围): 左闭右闭[left, right]或者左闭右开[left, right)

 *  注意:下述为左闭右闭的写法(左闭右开的写法在注释里)

 *  包含变量: left, right, mid

 *  适用条件: 数组有序，数组中无重复元素
 */
public class binarySearch {

    //测试
    public static void main(String[] args) {
        int[] nums = {-1,0,3,5,9,12};
        int target = 9;
        int res = search(nums, target);
        System.out.println(res);
    }

    //只要看到面试题里给出的数组是有序数组，都可以想一想是否可以使用二分法。
    public static int search(int[] nums, int target) {
        int left = 0;
        int right = nums.length-1;

        //如果是左闭右开则为left<right,因为只有这样数组才是合法的
        while(left<=right){
            int mid = (left+right)/2;

            if(nums[mid]< target){
                //如果为左闭右开还为left = mid+1;
                left = mid+1;
            }
            else if(nums[mid]> target){
                //如果为左闭右开则为right = mid;
                right = mid-1;
            }
            else{
                return mid;
            }
        }
        return -1;
    }

}
